# list 的基本增删改查
import random

"""
增：
    + 、append 、extend
删：
    remove：
        # 报错：x not in list
        # 结合   if 'x' in shelves:  # 判断是否存在 
        元素  in  列表： 表示元素在列表中？ 返回值 bool
        如果列表中存在多个同名的元素，只删除遇到的第一个元素
    pop：
        pop(index):根据下标删除表中元素，下表在写的时候注意不要超出范围：index out of range
        pop():从后向前依次删除
    clear ：lst.clear()，清空后还可以添加元素
    del : del lst() 删除整个列表，删除后添加元素报错：’lst‘ is  not defined  内存被释放了
    
改：
    insert(index,value):index 位置  value  元素；插队其他元素后移
    lst[1]=2 直接定位赋值
    lst.index(元素)：定位元素位置
查：
    1. 元素 in 列表  返回值bool类型
    2. 元素 not in 列表  返回值bool类型  
    3. 列表.index(元素) 返回元素的下标位置，如果没有此元素则报错
    4. 列表.count(元素) 存在返回个数，不存在范围0
"""

print('添加操作'.center(30, '-'))
lst1 = []
lst2 = ['面包']
lst1.append('面条')
lst1.append('火腿')
lst1.append('方便面')
print(lst1)
lst2.append('薯条')
print(lst2)
'''
数字：n = 1+3
字符串：s = 'aa' + 'bb' --->aabb
列表：
    list = [1,2,3,4] + [a,d,f] --->[1,2,3,4,a,d,f]
list合并：
    +  和 extend
'''
lst1 += lst2
print(lst1)

lst1.extend(lst2)
print(lst1)

'''
买多件商品：
    商品名称、价格、数量
    计算商品总数和总价格
'''
shelves = ['面条', '火腿', '方便面', '辣条', '鸡腿', '火腿长']  # 货架
cart = []  # 购物车
sm_price = 0.0  # 商品总价
sm = 0  # 商品总数量
while True:
    product = []
    name = shelves[random.randint(0, 5)]
    price = round(random.random() * 100, 2)
    count = random.randint(1, 10)  # 限制最多10件
    product.append(name)
    product.append(price)
    product.append(count)
    cart.append(product)
    sm_price += price * count
    sm += count
    flag = input('是否退出?(按q/Q退出)')
    if flag.lower() == 'q':
        break
print("购物车：", cart)
print("商品总数", sm)
print("总价格", sm_price)

# 遍历购物清单
print('名称\t\t价格\t\t数量')
for product in cart:
    print(product[0], product[1], product[2], sep="\t\t")

print('删除操作'.center(30, '-'))
print(shelves)
# shelves.pop(9)  # 添加下标，pop index out of range
shelves.pop()  # 根据下标从左道右删除
print(shelves)
# shelves.remove('x')  # 报错：x not in list
# 判断是否存在元素
if 'x' in shelves:  # 判断是否存在
    shelves.remove('x')
shelves.remove('方便面')
print(shelves)  # 根据元素名称删除

print('删除多个元素'.center(30, '-'))
# 删除多个相同元素

goods = ['面条', '火腿', '方便面', '面条', '面条', '辣条', '鸡腿', '面条', '火腿长', '面条']

# 会造成漏删：因为下标错乱导致
for good in goods:
    if good == '面条':
        goods.remove(good)
print(goods)

# 解决漏删问题：方案一
while goods.__contains__('面条'):
    for good in goods:
        if good == '面条':
            goods.remove(good)
print(goods)
goods = ['面条', '火腿', '方便面', '面条', '面条', '辣条', '鸡腿', '面条', '火腿长', '面条']
# 解决漏删问题：方案二：(拷贝了一份数据)和正反无关
for good in goods[::-1]:
    if good == '面条':
        goods.remove(good)
print(goods)

new_goods = ['面条', '火腿', '方便面', '面条', '面条', '辣条', '鸡腿', '面条', '火腿长', '面条']
# 解决漏删问题：方案二 (拷贝了一份数据)
for good in new_goods[::]:
    if good == '面条':
        new_goods.remove(good)
print(new_goods)

del new_goods[3]  # 删除元素  和 new_goods.pop(3) 类似
print(new_goods)

print('修改元素'.center(50, '-'))
lst = [1, 2, 4, 5, 6, 8]
lst.insert(2, 3)
print(lst)

lst[0] = 0
print(lst)

lst[lst.index(8)] = 9  # index(元素) 获取元素位置，定位
print(lst)
print(lst.clear())

print('查找元素'.center(50, '-'))

lst = [1, 2, 4, 5, 6, 8, 8, 8, 8]
print(lst.count(8))
print(lst.count(9))

print('内存地址诠释'.center(50, '-'))

lst = [1, 2, 4, 5, 6, 8, 8, 8, 8]
lst2 = lst
# lst.clear()
del lst2  # 删除指针指向
print(lst)
# print(lst2)
print(id(lst))
# print(id(lst2))
